<?php
/**
 * Created by PhpStorm.
 * User: bzg
 * Date: 2019/11/29
 * Time: 17:18
 */

namespace App\Extend\SysExtend\Token;


use App\Extend\SysExtend\Helper;
use EasySwoole\Component\Singleton;
use EasySwoole\Jwt\Jwt;

class Token
{
    use Singleton;

    private $conf;

    private $jwt;

    private function __construct()
    {
        $this->conf = Helper::config('token');
        // 实例化JWT对象
        $this->jwt = Jwt::getInstance();
    }

    /**
     * 生成一个token
     * @param array $data
     * @return string
     */
    public function create(array $data)
    {
        $jwt = $this->jwt->setSecretKey($this->conf['secret'])->publish();
        $jwt->setAlg($this->conf['alg']); // 加密方式
        $jwt->setIss($this->conf['iss']); // 发行人
        $jwt->setSub(''); // 主题
        $jwt->setAud(''); // 用户
        $jwt->setExp(time()+$this->conf['time_out']); // 过期时间
        $jwt->setIat(time()); // 发布时间
        $jwt->setJti(md5(time())); // jwt id 用于标识该jwt
        // 自定义数据
        $jwt->setData($data);
        // 最终生成的token
        return $jwt->__toString();
    }

    /**
     * 校验token
     * @param string $token
     * @return string
     */
    public function check(string $token)
    {
        try {
            //如果encode设置了秘钥,decode 的时候要指定
            $jwtObject = $this->jwt->setSecretKey('easyswoole')->decode($token);
            $status = $jwtObject->getStatus();

            switch ($status)
            {
                case -1:
                    return 'token无效';
                case  1:
                    return $jwtObject->getData();
                    break;
                case  2:
                    return '验证失败';
                    break;
                case  3:
                    return 'token过期';
                    break;
            }
        } catch (\EasySwoole\Jwt\Exception $e) {
            return 'token无效';
        }
    }
}